007. Reverse Integer[E]——处理溢出的技巧

题目

Reverse digits of an integer.

Example1: x = 123, return 321
Example2: x = -123, return -321

思路

这题完全没丝毫的难度,任何人几分钟都可以写出来,但是,这题修改后,加入了一个新的测试,瞬间大家讨论的就多了,就是——溢出测试

因为整数只有32位,可能原数不会溢出,但是转置后就不一定了,所以必须要考虑溢出的情况。

思路1——用long

一个比较讨巧的方案,直接用long不会溢出再和INT_MAX比较就好了

  1. class Solution {
  2. public:
  3. int reverse(int x) {
  4. long tmp=0;
  5. while(x != 0)
  6. {
  7. tmp *=10;
  8. tmp += x%10;
  9. if(tmp > INT_MAX || tmp < INT_MIN)
  10. return 0;
  11. x /= 10;
  12. }
  13. return tmp;
  14. }
  15. };

思路2——变化前后对比

bitzhuwei的代码。
不用任何flag和INT_MAX宏或者任何硬编码Ox7fffffff
这个思路 也是很容易理解的,做一些操作,如果溢出了,那溢出后的值做反向操作会和之前的值不一样。

这里就用一个变量存储变化后的值,每次做反向操作,如果和之前的值一样就更新,不一样,说明溢出了。
```c++
public int reverse(int x)
{
int result = 0;

  1. while (x != 0)
  2. {
  3. int tail = x % 10;
  4. int newResult = result * 10 + tail;
  5. if ((newResult - tail) / 10 != result)
  6. { return 0; }
  7. result = newResult;
  8. x = x / 10;
  9. }
  10. return result;

}

  1. ###**思路3——提前停止操作**
  2. 如果当前的数已经>INT_MAX/10 那么再做一次操作,必然溢出。
  3. ```c++
  4. class Solution
  5. {
  6. public:
  7. int reverse(int n)
  8. {
  9. int result = 0;
  10. while (n != 0)
  11. {
  12. if (result > INT_MAX / 10
  13. || ((result == INT_MAX / 10) && (n % 10 > INT_MAX % 10)))
  14. {
  15. result = 0;
  16. break;
  17. }
  18. if (result < INT_MIN / 10
  19. || ((result == INT_MIN/ 10) && (n % 10 < INT_MIN % 10)))
  20. {
  21. result = 0;
  22. break;
  23. }
  24. result = result * 10 + n % 10;
  25. n = n / 10;
  26. }
  27. return result;
  28. }
  29. };